#include "mainwidget.h" // 引入主窗口头文件
#include "./ui_mainwidget.h" // 引入UI界面头文件
#include <QHBoxLayout> // 引入水平布局类
#include <QVBoxLayout> // 引入垂直布局类
#include <QSplitter> // 引入分割窗口类
#include <QVector> // 引入QVector容器类
#include <QSqlDatabase> // 引入数据库相关类
#include <QSqlQuery> // 引入SQL查询类
#include <QSqlError> // 引入SQL错误处理类
#include <QTextEdit> // 引入多行文本编辑器类
#include <QDebug> // 引入调试输出类
#include <QMouseEvent> // 引入鼠标事件类
#include <QGraphicsDropShadowEffect> // 引入阴影效果类

#include "sessionfriendarea.h" // 引入会话/好友区域头文件
#include "DatabaseManager.h" // 引入数据库管理器头文件

MainWidget *MainWidget::instance = nullptr; // 静态成员变量初始化，单例模式

MainWidget *MainWidget::getInstance()
{
    if (instance == nullptr)
    {
        instance = new MainWidget(); // 如果实例不存在则创建
    }
    return instance; // 返回实例
}

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent), ui(new Ui::MainWidget)
{
    qDebug() << "MainWidget 构造"; // 输出调试信息
    ui->setupUi(this); // 设置UI界面

    this->setWindowTitle("我的聊天室"); // 设置窗口标题
    this->setWindowIcon(QIcon(":/recource/image/app.png")); // 设置窗口图标
    // 初始化数据库
    DatabaseManager::instance().initDatabase(); // 初始化数据库
    // 初始化主窗口的样式布局
    initMainWindow(); // 初始化主窗口布局
    // 初始化左侧窗口布局
    initLeftWindow(); // 初始化左侧窗口布局
    // 初始化右侧窗口布局
    initRightWindow(); // 初始化右侧窗口布局
    // 初始化信号槽
    initSignalSlot(); // 初始化信号与槽

    // 允许窗口自由调整大小
    setWindowFlags(Qt::Window | Qt::FramelessWindowHint); // 设置窗口为无边框可拖动
    setMinimumSize(600, 400); // 可选，设置一个较小的最小尺寸
}

MainWidget::~MainWidget()
{
    delete ui; // 析构时释放UI资源
}

void MainWidget::initMainWindow()
{
    // 1. 设置窗口属性（圆角、阴影、透明背景）
    setAttribute(Qt::WA_TranslucentBackground); // 设置窗口背景透明

    // 阴影
    QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this); // 创建阴影效果
    shadow->setBlurRadius(32); // 设置阴影模糊半径
    shadow->setColor(QColor(0, 0, 0, 40)); // 设置阴影颜色
    shadow->setOffset(0, 4); // 设置阴影偏移
    this->setGraphicsEffect(shadow); // 应用阴影效果

    // 2. 创建主布局
    QVBoxLayout *mainLayout = new QVBoxLayout(this); // 创建垂直主布局
    mainLayout->setContentsMargins(10, 10, 10, 10); // 给阴影留空间
    mainLayout->setSpacing(0); // 设置间距为0

    // 4. 主内容区（左右分栏）
    mainSplitter = new QSplitter(Qt::Horizontal, this); // 创建水平分割条
    mainSplitter->setHandleWidth(1); // 设置分割条宽度
    mainSplitter->setChildrenCollapsible(false); // 禁止子窗口折叠

    windowLeft = new QWidget(); // 创建左侧窗口
    windowRight = new QWidget(); // 创建右侧窗口

    windowLeft->setMinimumWidth(200); // 设置左侧最小宽度
    windowLeft->setMaximumWidth(320); // 设置左侧最大宽度
    windowRight->setMinimumWidth(500); // 设置右侧最小宽度

    windowLeft->setStyleSheet("QWidget { background-color: #f7f7f7; border-top-left-radius:18px; border-bottom-left-radius:18px; }"); // 设置左侧样式
    windowRight->setStyleSheet("QWidget { background-color: #ffffff; border-top-right-radius:18px; border-bottom-right-radius:18px; }"); // 设置右侧样式

    mainSplitter->addWidget(windowLeft); // 添加左侧窗口到分割条
    mainSplitter->addWidget(windowRight); // 添加右侧窗口到分割条
    mainSplitter->setStretchFactor(0, 0); // 设置左侧不拉伸
    mainSplitter->setStretchFactor(1, 1); // 设置右侧拉伸

    mainLayout->addWidget(mainSplitter, 1); // 添加分割条到主布局

    // 5. 设置主布局
    setLayout(mainLayout); // 应用主布局
}

void MainWidget::initLeftWindow()
{
    qDebug() << "initLeftWindow called"; // 输出调试信息
    QVBoxLayout *layout = new QVBoxLayout(); // 创建垂直布局
    layout->setSpacing(10); // 设置控件间距
    layout->setContentsMargins(10, 15, 10, 10); // 设置边距
    windowLeft->setLayout(layout); // 应用布局到左侧窗口

    windowControlBar = new QWidget(this); // 创建窗口控制栏
    windowControlBar->setFixedHeight(16); // 设置固定高度
    windowControlBar->setStyleSheet("background: transparent;"); // 设置背景透明

    QHBoxLayout *controlLayout = new QHBoxLayout(windowControlBar); // 创建水平布局用于控制按钮
    controlLayout->setContentsMargins(9, 0, 0, 0); // 设置边距
    controlLayout->setSpacing(8); // 设置间距

    closeBtn = new QPushButton(windowControlBar); // 创建关闭按钮
    closeBtn->setFixedSize(12, 12); // 设置按钮大小
    closeBtn->setStyleSheet(
        "QPushButton {"
        " background: #FF5F56;"
        " border-radius: 6px;"
        " border: none;"
        "}"
        "QPushButton:hover {"
        " background: #e0483e;"
        "}"); // 设置关闭按钮样式

    minBtn = new QPushButton(windowControlBar); // 创建最小化按钮
    minBtn->setFixedSize(12, 12); // 设置按钮大小
    minBtn->setStyleSheet(
        "QPushButton {"
        " background: #FFBD2E;"
        " border-radius: 6px;"
        " border: none;"
        "}"
        "QPushButton:hover {"
        " background: #e1a116;"
        "}"); // 设置最小化按钮样式

    maxBtn = new QPushButton(windowControlBar); // 创建最大化按钮
    maxBtn->setFixedSize(12, 12); // 设置按钮大小
    maxBtn->setStyleSheet(
        "QPushButton {"
        " background: #27C93F;"
        " border-radius: 6px;"
        " border: none;"
        "}"
        "QPushButton:hover {"
        " background: #13a10e;"
        "}"); // 设置最大化按钮样式

    controlLayout->addWidget(closeBtn); // 添加关闭按钮到布局
    controlLayout->addWidget(minBtn); // 添加最小化按钮到布局
    controlLayout->addWidget(maxBtn); // 添加最大化按钮到布局
    controlLayout->addStretch(1); // 添加弹性空间

    layout->addWidget(windowControlBar); // 添加控制栏到左侧布局
    // 搜索框
    QLineEdit *searchEdit = new QLineEdit(); // 创建搜索框
    searchEdit->setPlaceholderText("搜索联系人/会话"); // 设置提示文字
    searchEdit->setFixedHeight(32); // 设置高度
    searchEdit->setStyleSheet("QLineEdit { border-radius: 16px; background: #ededed; padding-left: 12px; font-size:15px;}"); // 设置样式
    layout->addWidget(searchEdit); // 添加搜索框到布局

    // 会话/好友/申请滚动区
    sessionFriendArea = new SessionFriendArea(this); // 创建会话/好友区域
    layout->addWidget(sessionFriendArea, 1); // 1 表示拉伸因子，让其填满剩余空间
}

void MainWidget::initRightWindow()
{
    QVBoxLayout *vlayout = new QVBoxLayout(); // 创建垂直布局
    vlayout->setSpacing(0); // 设置控件间距为0
    vlayout->setContentsMargins(0, 0, 0, 0); // 设置边距为0
    windowRight->setLayout(vlayout); // 应用布局到右侧窗口
    // 顶部标题栏
    titleBar = new QWidget(); // 创建标题栏部件
    titleBar->setFixedHeight(56); // 设置标题栏高度
    QHBoxLayout *titleLayout = new QHBoxLayout(titleBar); // 创建水平布局用于标题栏
    titleBar->setStyleSheet("background: #fff; border-bottom: 1px solid #eee;"); // 设置标题栏样式
    titleLayout->setContentsMargins(10, 0, 10, 0); // 设置标题栏边距
    titleLayout->setSpacing(10); // 设置标题栏控件间距

    // 返回按钮
    backBtn = new QPushButton("<"); // 创建返回按钮
    backBtn->setFixedSize(32, 32); // 设置返回按钮大小
    backBtn->setStyleSheet("QPushButton { border:none; background:transparent; font-size:20px; color:#888; }"
                           "QPushButton:hover { background:#f5f5f5; }"); // 设置返回按钮样式

    // 标题
    titleLabel = new QLabel("会话标题"); // 创建标题标签
    titleLabel->setStyleSheet("font-size:18px; font-weight:bold; color:#222;"); // 设置标题样式
    // 不设置固定宽度，让其自适应

    // Note按钮
    noteBtn = new QPushButton("Note"); // 创建Note按钮
    // noteBtn->setFixedSize(48, 32);
    noteBtn->setStyleSheet("QPushButton { border-radius: 16px; color:#666; font-size:15px; padding:0 12px; }"); // 设置Note按钮样式

    // 添加到布局
    titleLayout->addWidget(backBtn, 0, Qt::AlignLeft); // 添加返回按钮到标题栏
    titleLayout->addWidget(titleLabel, 1); // 伸展，居左
    titleLayout->addWidget(noteBtn, 0, Qt::AlignRight); // 添加Note按钮到标题栏

    vlayout->addWidget(titleBar); // 添加标题栏到右侧布局

    // 消息展示区
    messageShowArea = new MessageShowArea(); // 创建消息展示区
    messageShowArea->setStyleSheet("background: #fff; border:none;"); // 设置消息展示区样式
    vlayout->addWidget(messageShowArea, 1); // 添加消息展示区到布局，1为拉伸因子

    // 底部输入区
    inputBar = new QWidget(); // 创建输入栏部件
    inputBar->setFixedHeight(180); // 设置输入栏高度
    inputBar->setStyleSheet("background: #fff; border-top: 1px solid #f0f0f0;"); // 设置输入栏样式

    QVBoxLayout *inputBarLayout = new QVBoxLayout(inputBar); // 创建输入栏垂直布局
    inputBarLayout->setContentsMargins(20, 12, 20, 12); // 设置输入栏边距
    inputBarLayout->setSpacing(8); // 设置输入栏控件间距

    // 第一行：功能按钮
    QHBoxLayout *funcLayout = new QHBoxLayout(); // 创建功能按钮水平布局
    funcLayout->setContentsMargins(0, 0, 0, 0); // 设置边距为0
    funcLayout->setSpacing(0); // 设置间距为0

    emojiBtn = new QPushButton(); // 创建表情按钮
    emojiBtn->setFixedSize(28, 28); // 设置表情按钮大小
    emojiBtn->setIcon(QIcon(":/recource/image/sound.png")); // 设置表情按钮图标
    emojiBtn->setStyleSheet(
        "QPushButton { border:none; background:transparent; }"
        "QPushButton:hover { background:#f5f5f5; border-radius:14px; }"); // 设置表情按钮样式
    funcLayout->addWidget(emojiBtn, 0, Qt::AlignLeft); // 添加表情按钮到布局
    funcLayout->addStretch(1); // 添加弹性空间

    inputBarLayout->addLayout(funcLayout); // 添加功能按钮布局到输入栏

    // 第二行：输入框
    inputEdit = new QTextEdit(); // 创建多行文本输入框
    inputEdit->setPlaceholderText("Message"); // 设置输入框提示文字
    int lineHeight = inputEdit->fontMetrics().lineSpacing(); // 获取字体行高
    inputEdit->setMinimumHeight(3 * lineHeight + 12); // 设置最小高度
    inputEdit->setMaximumHeight(3 * lineHeight + 12); // 设置最大高度
    inputEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); // 设置垂直滚动条策略
    inputEdit->setStyleSheet(
        "QTextEdit {"
        " border-radius: 12px;"
        " background: #fafbfc;"
        " padding-left: 12px;"
        " padding-top: 8px;"
        " font-size:16px;"
        " color:#222;"
        " border: 1px solid #e5e6e8;"
        "}"); // 设置输入框样式
    inputEdit->setWordWrapMode(QTextOption::WordWrap); // 设置自动换行
    inputBarLayout->addWidget(inputEdit, 0); // 添加输入框到输入栏

    // 第三行：发送按钮，靠右
    QHBoxLayout *sendLayout = new QHBoxLayout(); // 创建发送按钮水平布局
    sendLayout->setContentsMargins(0, 0, 0, 0); // 设置边距为0
    sendLayout->addStretch(1); // 添加弹性空间
    sendBtn = new QPushButton("发送"); // 创建发送按钮
    sendBtn->setFixedSize(80, 36); // 设置发送按钮大小
    sendBtn->setStyleSheet(
        "QPushButton {"
        " border-radius: 18px;"
        " background: #1677ff;"
        " color: white;"
        " font-size:16px;"
        " padding:0 8px;"
        " border: none;"
        " font-weight: bold;"
        "}"
        "QPushButton:hover { background: #1456c3; }"); // 设置发送按钮样式
    sendLayout->addWidget(sendBtn, 0, Qt::AlignRight | Qt::AlignBottom); // 添加发送按钮到布局

    inputBarLayout->addLayout(sendLayout); // 添加发送按钮布局到输入栏

    vlayout->addWidget(inputBar); // 添加输入栏到右侧布局
}

void MainWidget::initSignalSlot()
{
    // 只保留会话列表的信号槽
    connect(sessionList, &QListWidget::currentRowChanged, this, [this](int row)
            {
                // 根据 row 切换右侧内容
                // 例如：this->loadSession(row);
            }); // 连接会话列表当前行变化信号到对应槽函数
    // 窗口控制按钮信号槽
    connect(closeBtn, &QPushButton::clicked, this, &QWidget::close); // 关闭按钮点击时关闭窗口
    connect(minBtn, &QPushButton::clicked, this, [this]()
            {
        if (isMinimized()) {
            showNormal(); // 如果已最小化则还原
        } else {
            showMinimized(); // 否则最小化
        } });
    connect(maxBtn, &QPushButton::clicked, this, [this]()
            {
        if (isMaximized()) {
            showNormal(); // 如果已最大化则还原
        } else {
            showMaximized(); // 否则最大化
        } });
}

void MainWidget::loadSessionList()
{
    sessionList->clear(); // 清空会话列表
    // 查询所有会话
    QSqlQuery query("SELECT id, name, type FROM sessions"); // 查询sessions表
    while (query.next())
    {
        int sessionId = query.value(0).toInt(); // 获取会话id
        QString name = query.value(1).toString(); // 获取会话名称
        int type = query.value(2).toInt(); // 获取会话类型
        // 你可以根据 type 设置不同的icon
        QIcon icon = (type == 0) ? QIcon(":/recource/image/session.png") : QIcon(":/recource/image/group.png"); // 根据类型设置图标
        QListWidgetItem *item = new QListWidgetItem(icon, name); // 创建会话项
        item->setData(Qt::UserRole, sessionId); // 记录会话id，后续可用
        sessionList->addItem(item); // 添加到会话列表
    }
}

void MainWidget::loadFriendList()
{
    sessionList->clear(); // 清空会话列表
    QVariantList users = DatabaseManager::instance().queryAllUsers(); // 查询所有用户
    for (const QVariant &v : users)
    {
        QVariantMap user = v.toMap(); // 转为map
        int userId = user["id"].toInt(); // 获取用户id
        QString name = user["name"].toString(); // 获取用户名
        QString avatar = user["avatar"].toString(); // 获取头像路径
        QIcon icon(avatar.isEmpty() ? ":/recource/image/default_avatar.png" : avatar); // 设置头像
        QListWidgetItem *item = new QListWidgetItem(icon, name); // 创建好友项
        item->setData(Qt::UserRole, userId); // 记录用户id
        sessionList->addItem(item); // 添加到会话列表
    }
}

void MainWidget::loadApplyList()
{
    sessionList->clear(); // 清空会话列表
    // 假设有 apply 表，实际开发中请替换为真实查询
    QSqlQuery query("SELECT id, name, reason FROM apply"); // 查询apply表
    while (query.next())
    {
        int applyId = query.value(0).toInt(); // 获取申请id
        QString name = query.value(1).toString(); // 获取申请人名
        QString reason = query.value(2).toString(); // 获取申请理由
        QListWidgetItem *item = new QListWidgetItem(QIcon(":/recource/image/apply.png"), name + " - " + reason); // 创建申请项
        item->setData(Qt::UserRole, applyId); // 记录申请id
        sessionList->addItem(item); // 添加到会话列表
    }
    // 如果没有表，可以用如下模拟
    QListWidgetItem *item = new QListWidgetItem(QIcon(":/recource/image/apply.png"), "新朋友A - 请求加你为好友"); // 模拟申请项
    sessionList->addItem(item); // 添加到会话列表
}

void MainWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton && (windowControlBar && windowControlBar->geometry().contains(event->pos()) || titleBar && titleBar->geometry().contains(event->pos())))
    {
        dragging = true; // 标记为正在拖动
        dragPosition = event->globalPosition().toPoint() - frameGeometry().topLeft(); // 记录拖动起始位置
        event->accept(); // 接受事件
    }
}

void MainWidget::mouseMoveEvent(QMouseEvent *event)
{
    if (dragging && (event->buttons() & Qt::LeftButton))
    {
        move(event->globalPosition().toPoint() - dragPosition); // 移动窗口
        event->accept(); // 接受事件
    }
}

void MainWidget::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event); // 未使用参数
    dragging = false; // 拖动结束
}

void MainWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
    if (windowControlBar && windowControlBar->geometry().contains(event->pos()))
    {
        if (isMaximized())
        {
            showNormal(); // 如果已最大化则还原
        }
        else
        {
            showMaximized(); // 否则最大化
        }
    }
}
